#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include"../1027/seqstack/stack.h"
#include"../1027/seqqueue/queue.h"


static int sort_ball(queue *q);

int main(void){
	queue * q = NULL;//放27个球的队列
	int capacityq = 28;//顺序栈  留一个

	int i;//控制27个球进队列
	int tem;//出队列的数据
	int temstack;//出栈的数据
	
	int days = 0;//过的天数

	stack_t *hour = NULL;
	int capacityh = 11;
	
	stack_t *f_min = NULL;
	int capacityfm = 11;

	stack_t *min = NULL;
	int capacitym = 4;

	queue_init(&q, capacityq, sizeof(int));
	stack_init(&hour, sizeof(int), capacityh);
	stack_init(&f_min, sizeof(int), capacityfm);
	stack_init(&min, sizeof(int), capacitym);
	
	for(i = 1; i < 28; i++){
		enqueue(q, &i);
	}
	printf("球球全部入队！\n");
	while(1){
		dequeue(q, &tem);// 取出队列里的

		if(stack_full(min)){
			//min 满了
			//printf("min满了\n");
			while(!stack_empty(min)){
				stack_pop(min, &temstack);
				enqueue(q, &temstack);
			}
			if(stack_full(f_min)){// 判断5min的满没满
				//printf("fmin满了！");
				while(!stack_empty(f_min)){
					stack_pop(f_min, &temstack);
					enqueue(q, &temstack);
				}
				if(stack_full(hour)){//判断hour满没满
					//printf("%d\n",days);
				//	enqueue(q, &tem); // 补充第12个球，避免丢失
					while(!stack_empty(hour)){
						stack_pop(hour, &temstack);
						enqueue(q, &temstack);
					}
					enqueue(q, &tem); // 补充第12个球，避免丢失
					days++;
				//	if(is_queue_ordered(q)){
					if(sort_ball(q)){
						break;
					}
				}else{
					stack_push(hour, &tem);
				}
			}else{
				stack_push(f_min, &tem);
			}
		}else{//min非满
			stack_push(min, &tem);
		}	
	}
	
	printf("%d\n ", days);
	queue_destroy(&q);
	stack_destroy(&min);
	stack_destroy(&f_min);
	stack_destroy(&hour);

	return 0;
}

static int sort_ball(queue *q)
{
	int arr[27] = {};
	int i = 0;

	while (!queue_is_empty(q)) {
		dequeue(q, arr + i);
		i++;
	}

	// debug
	for (i = 0; i < 27; i++)
		printf("%d ", arr[i]);
	printf("\n");

	// 顺序
	for (i = 0; i < 27 - 1; i++) {
		if (arr[i] > arr[i + 1])
			break;
	}
	if (i == 27 - 1)
		return 1;

	for (i = 0; i < 27; i++)
		enqueue(q, arr + i);

	return 0;
}


